package com.lcj.controller2;

import com.lcj.vo.UserVo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import javax.servlet.http.HttpSession;

@Controller
@SessionAttributes("user")
@RequestMapping("/session2")
public class SessionController2 {
    @RequestMapping("/f1")
    public String f1(HttpSession session){
        UserVo user = new UserVo();
        user.setAge(1);
        user.setUsername("admin");
        session.setAttribute("user",user);
        return "success";
    }

    @RequestMapping("/f2")
    public void f2(HttpSession session){
        UserVo user = (UserVo) session.getAttribute("user");
        System.out.println(user);
    }

    @RequestMapping("/f3")
    public String f3(UserVo user){
        user.setUsername("admin");
        return "success";
        // 此时的数据是存放在request作用域中的
        // 因为当参数是一个对象的时候,默认添加@ModelAttribute注解
        // 此时可以在类上加一个@SessionAttributes(key)注解
        // 表示当操作作用域的数据的时候,如果遇到key为注解的参数的时候
        // 将会在session中进行操作,此时request作用域中仍然存在数据
    }

    @RequestMapping("/f4")
    public void f4(UserVo user){
        System.out.println(user.getUsername());
        // 当参数没有添加注解的时候,此时作用域中如果没有数据
        // 则不会自动添加@ModelAttribute注解
        // 则返回null
    }

    @RequestMapping("/f5")
    public void f5(@ModelAttribute UserVo user){
        System.out.println(user.getUsername());
        // 当参数添加了注解之后,表示一定会从session作用域中取数据
        // 如果session作用域中没有数据,则报错
    }

    @RequestMapping("/f6")
    public String f6(HttpSession session){
        session.invalidate();
        return "success";
        // 在做清除session数据的操作的时候
        // 如果当前类使用@SessionAttributes进行标注之后
        // 则无法使用原有的方式进行清除
        // 当类没有使用@SessionAttribute进行标注的时候
        // 仍然可以使用HttpSession提供的方法进行清除
    }

    @RequestMapping("/f7")
    public String f7(SessionStatus status){
        // 当类被@SessionAttributes标注的时候
        // 需要使用Spring提供的对象SessionStatus进行清除操作
        // 该方法只会单独清理session中的数据
        // 不会影响到原有的request中的数据
        status.setComplete();
        return "success";
    }

}
